package com.sd365.permission.centre.service;

import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @Class RoleService
 * @Description 优化代码和修复bug
 * @Author Administrator
 * @Date 2022-9-30  14:48
 * @version 1.0.0
 */
@CacheConfig(cacheNames = "RoleService")
public interface RoleService {
    byte INITIALIZE_STATUS_VALUE=1;
    long INITIALIZE_VERSION_VALUE=1;

    Boolean initRoleResourceRedis(Role role);
    /**
     * @Description: 批量插入，插入前先删除原来的角色和资源的关系
     * @Author: Administrator
     * @DATE: 2022-9-30  17:20
     * @param: 前端选择的角色资源列表
     * @return: 成功ture 失败 false
     */
    @Transactional
    Boolean assignResource(RoleResourceDTO roleResourceDTO);

    /**
     * @Description: 删除原来的用户 插入行的用户，新的用户以勾选的用户为准
     * @Author: Administrator
     * @DATE: 2022-9-30  14:46
     * @param: 勾选的用户列表
     * @return: 成功true 否则失败
     */
    @Transactional
    Boolean assignUser(UserRoleDTO userRoleDTO);

    /**
     * 查询角色所拥有的所有资源
     * @return Node
     */
    List<Node> queryResourceByRoleId(long roleId);

    /**
     * 查询公司节点
     * @return Node
     */
    List<Node> selectCompany();

    /**
     * 验证是否已经存在角色
     * @return Node
     */
    boolean haveRole(@RequestBody @Valid RoleDTO roleDTO);

    /**
     * @param: 角色DTO
     * @return: 成功则true
     * @see
     * @since
     */

    Boolean add(@RequestBody @Valid RoleDTO roleDTO);


    /**
     * @param:
     * @return:
     * @see
     * @since
     */
    Boolean remove(Long id, Long version);


    /**
     * @param:角色DTO
     * @return:
     * @see
     * @since
     */



    Boolean modify(RoleDTO roleDTO);


    /**
     * @param:角色DTO
     * @return:
     * @see
     * @since
     */
    List<RoleDTO> commonQuery(RoleQuery roleQuery);

    /**
     * @param: 角色id
     * @return: RoleDTO
     * @see
     * @since
     */
    RoleDTO queryById(Long id);

    /**
     *  复制一条和RoleDTO 一样的记录并且将值返回前端
     * @param:
     * @return:
     * @see
     * @since
     */
    RoleDTO copy(Long id);
    /**
     *  批量删除
     * @param:
     * @return:
     * @see
     * @since
     */
    @Transactional
    Boolean batchRemove(RoleDTO[] roleDTOS);

    /**
     * @param:用户DTO
     * @return:
     * @see
     * @since
     */
    List<UserDTO> commonQueryUser(UserQuery userQuery);

    RoleDTO queryUserResource(Long id);

    /**
     * 通过角色id获取关联的授权公司列表
     * @author wujiandong
     * @param id
     * @return RoleCompanyVO
     */
    RoleCompanyVO queryRoleCompanyById(Long id);

    /**
     * 修改角色id关联的授权公司列表
     * @author wujiandong
     * @param roleCompanyDTO
     * @return
     */
    @Transactional
    Boolean modifyRoleCompany(RoleCompanyDTO roleCompanyDTO);
}
